Android 自定义ScrollView ListView 体验各种纵向滑动的需求

您所在的位置:网站首页 android recyclerview滑动监听 Android 自定义ScrollView ListView 体验各种纵向滑动的需求

Android 自定义ScrollView ListView 体验各种纵向滑动的需求

2023-03-22 16:09| 来源: 网络整理| 查看: 265

 分类: 【android 进阶之路】2014-08-31 12:59 6190人阅读 评论(10) 举报Android自定义ScrollView纵向拖动  转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38950509,本文出自【张鸿洋的博客】

1、概述

群里的一个哥们有个需求是这样的:问题;主要功能就是:1、循环的一个滑动;2、每次滑动结束,保持每个Item的完整。然后我当时给他写了个Demo,所有代码都在Activity里面,后期看来其太恶心了,修改也不方便;貌似那哥们还因为那代码修改到12点,大大的赞一下这哥们的毅力,也深表歉意,今天特意把代码抽取成自定义的ScrollView,然后提供一些回调出来;

本博客首先介绍使用自定义的ScrollView解决上面的问题,然后自定义ListView实现每次拖动完成后保持每个Item的完整;

关于横向滑动可以参考:

Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

Android 自定义RecyclerView 实现真正的Gallery效果

横向和纵向很类似哈,一个改写HorizontalScrollView,一个是ScrollView;一个改写ListView,一个是RecyclerView;不多具体需求还是有出入的,大家如果有这方面需求可以借鉴。关于横向有同学问如何保证滑动结束实现单个Item完整,可以参考今天纵向的代码。

2、自定义ScrollView实现循环Item拖动

现展示下效果图,然后讲解下原理,最后分析下代码~三部曲~

1、效果图:

Android 自定义ScrollView ListView 体验各种纵向滑动的需求

2、实现的原理

a、根据用户提供的Adapter(主要就两个方法,getCount【决定多少个Item】,getView【每个Item的样子】),根据getCount我会在初始化时,在ScrollView内部LinearLayout中添加对应数量的Item,当然也会根据数量平分屏幕高度;

b、监听onTouch方法,当用户触发ACTION_MOVE时,屏幕跟随用户手指上面移动,当达到顶部时,会动态为顶部添加一个Item,同时移除底部最后一个Item;用户滑动到达底部也一样,底部动态添加一个Item,顶部第一个移除;ScrollView内会始终维持用户指定数量+1个Item,为什么加1呢,因为拖动过程中最多会显示+1个Item(第一个一半,最后一个一半)

c、监听ACTION_UP,判断如果当然显示小于半个,缩回去;大于半个则慢慢显示出完整的Item;

3、代码分析

首先我们定义一个Adapter,用户给用户设置每个Item的样子以及个数;类似ListView的Adapter

/** * 适配器 * @author zhy * */ public static abstract class Adapter { public abstract View getView(SingleItemScrollView parent, int pos); public abstract int getCount(); }

构造方法中得到屏幕的高度

public SingleItemScrollView(Context context, AttributeSet attrs) { super(context, attrs); // 计算屏幕的高度 WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); mScreenHeight = outMetrics.heightPixels; mScreenHeight -= getStatusHeight(context); }

onMeasure中对Item进行添加,以及设置高度

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //防止多次调用 if (!flag) { mContainer = (ViewGroup) getChildAt(0); //根据Adapter的方法,为容器添加Item if (mAdapter != null) { mItemCount = mAdapter.getCount(); mItemHeight = mScreenHeight / mItemCount; mContainer.removeAllViews(); for (int i = 0; i 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3